/* -----------------------------------------------------------------------
 *   Copyright (C) 2008 by Denjs
 *   dplsoft@pisem.net
 *   http://qdroid.berlios.de
 * -----------------------------------------------------------------------
 *   This program is free software licensed under GNU GPL License v.2 ; see main.cpp fo details
 *   Эта программа является свободным программным обеспечением; распространяемым под
 *   лицензией GNU General Public License v.2 (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU версия 2.0)
 * ----------------------------------------------------------------------- */
/*
 * t_QDLibManager.h
 *
 *  Created on: 2009.04.28
 *      Author: Denjs
 *
 *  Класс инкапсулирующий функции управления
 *  библиотеками содержащими расширения среды qDOID
 *   - "боты" и функции
 *
 *  Версия класса 2009.04.28
 *  технология подгрузки расширений "2009.04.27_1930"
 *
*/

#ifndef T_QDLIBMANAGER_H_
#define T_QDLIBMANAGER_H_


#include <QtCore>
#include <QtGlobal>
#include <QtScript>
#include <QApplication>

struct LibDefItem //структура для описани язагруженной библиотеки
	{
		QString name; // имя библиотеки как её запрашивают
		QLibrary *lib; // объект QT для управления библиотекой
		QString fname; // имя файла
	};

class t_QDLibManager : public QObject
{
    Q_OBJECT
	/*
	 * Реестр загруженных библиотек с описанием файла, функций и т.п.
	 *
	 * */
    public:
    	// менеджер расширений "не мыслим" без скриптового движка с которым он работает...
    	t_QDLibManager(QScriptEngine *_QSEngine, QObject *_Parent);

    	QString libdirname; // под-каталог с расширениями
		QString libfilenamePrefix; // префикс для именифизического файла библиотеки. зависит от платформы.

		//данные о последней операции
		int 	LastErrCode; 		//  - код
		QString LastErrMessage; 	//	- описание
		QString LastErrTime; 		//  - время
		QString LastErrOperation;	//  - описание операции.
    
    int DebugLevel;
    public slots:
    	int load_lib(QString LibName);//загрузить библиотеку с именем LibName
    	int unload_lib(QString LibName);//загрузить библиотеку с именем LibName
      
    
    private:
		QMap<QString, LibDefItem> LoadedLibMap;
    	QScriptEngine *QSEngine;

};


//===============================================================================
// далее - некоторые глобальные функции для регистрации их в скриптовом движке.
//===============================================================================
// 2009.04.27 LoadQDroidLibrary()
// загрузка расширения qDROID и автоматическая регистрация типов и классов
// PROBE VERSION!!!!

static QScriptValue qdroid_LoadQDroidLibrary_function(QScriptContext *context, QScriptEngine *engine)
	{
		 int res;
		 /*/
         QString result;
         for (int i = 0; i < context->argumentCount(); ++i) {
             if (i > 0)
                 result.append(" ");
             result.append(context->argument(i).toString());
         }; /**/

		QString libname;
		libname = context->argument(0).toString();

        QScriptValue calleeData = context->callee().data();
        t_QDLibManager *QDLibManager = qobject_cast<t_QDLibManager*>(calleeData.toQObject());
        res=QDLibManager->load_lib(libname);
		return engine->toScriptValue(res);

     };




#endif /* T_QDLIBMANAGER_H_ */
